# Create your views here.
# -*- coding: utf-8 -*-
from django.views.generic.list_detail import object_list, object_detail
from wal.equipos.models import Equipo, EEntrada, ESalida, EStock
from wal.equipos.forms import EquiposForm, EEntradasForm, ESalidasForm
from wal.pedidos.forms import SearchForm
from django.template.context import RequestContext
from django.shortcuts import render_to_response
#from wal.views import update_object, create_object , delete_object
from django.views.generic.create_update import update_object, create_object , delete_object
from django.core.exceptions import ObjectDoesNotExist
from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect
from wal.views import split_query_into_keywords
from django.db.models import Q

def obtenerEquipo(request,object_id):
    if int(object_id):
        try:
            objectoEquipo = Equipo.objects.get(id=object_id)
        except ObjectDoesNotExist:
            return 'No existe el objecto'
    else:
        return 'No existe el objecto'
    return objectoEquipo

def listar(request,ot,o,page):
    
    request.breadcrumbs([('Depósito','/wal/dep'),('Equipos',request.path)])
    
    if ot=='asc':
        if int(o) == 1:
            orden = "-nombre"
        elif int(o) == 2:
            orden = "-descripcion"
        else:
            orden = "-nombre"
    elif ot=='desc':
        if int(o) == 1:
            orden = "nombre"
        elif int(o) == 2:
            orden = "descripcion"
        else:
            orden = "nombre"
    else:
        orden = "-nombre"
    if request.method == 'GET':
        form = SearchForm(request.GET)
        if form.is_valid():
            keywords = form.cleaned_data['keywords']
            keyword_list = split_query_into_keywords(keywords)
            equipos = search_for_keywords(keyword_list)
            if equipos:
                # Show the results
                qs = equipos.order_by(orden)
            else:
                qs = Equipo.objects.none()
            form = SearchForm()
            return object_list(request,
                   queryset = qs,
                   allow_empty = True,
                   template_name = 'equipos/listar.html',
                   extra_context = {'ot':ot,'o':o,'page':page,'form':form},
                   paginate_by = 20,
                   page = page,
                   )
    else:
        form = SearchForm()
    return object_list(request,
                   queryset = Equipo.objects.order_by(orden),
                   allow_empty = True,
                   template_name = 'equipos/listar.html',
                   extra_context = {'ot':ot,'o':o,'page':page,'form':form},
                   paginate_by = 20,
                   page = page,
                   )
    
def ver(request, object_id):
    equipo = obtenerEquipo(request, object_id)
    
    request.breadcrumbs([('Depósito','/wal/dep'),('Equipos',reverse(listar,args=['asc',1,1])),(equipo.nombre,request.path)])
    
    if equipo == 'No existe el objecto':
        return render_to_response('error.html',{'error':'No existe el objecto'})
    return render_to_response('equipos/detalles.html', {'equipo': equipo}, context_instance=RequestContext(request))

def crear(request):
    request.breadcrumbs([('Depósito','/wal/dep'),('Equipos',reverse(listar,args=['asc',1,1])),('Crear Equipo',request.path)])
    return create_object(request,
                         model = Equipo, 
                         form_class = EquiposForm,
                         template_name = 'equipos/equipo.html', 
                         post_save_redirect = '/wal/equipos/listar/ot=asc&o=1&page=1'
                         )

def editar(request, object_id):
    equipo = obtenerEquipo(request, object_id)
    if equipo == 'No existe el objecto':
        return render_to_response('error.html',{'error':'No existe el objecto'})

    request.breadcrumbs([('Depósito','/wal/dep'),('Equipos',reverse(listar,args=['asc',1,1])),('Editar '+equipo.nombre,request.path)])

    return update_object(request,
                        model = Equipo, 
                        #form_class = PedidosForm,
                        template_name = 'equipos/equipo.html', 
                        post_save_redirect = '/wal/equipos/ver/'+str(object_id),
                        object_id = object_id
                        )
    
def borrar(request, object_id,ot,o,page):
    equipo = obtenerEquipo(request, object_id)
    if equipo == 'No existe el objecto':
        return render_to_response('error.html',{'error':'No existe el objecto'})
    return delete_object(request,
                         model = Equipo, 
                         template_name = 'equipos/confirm_delete_equipo.html', 
                         post_delete_redirect = reverse(listar, args=[ot,o,page]),
                         object_id = object_id
                         )
    
def search_for_keywords(keywords):
    """Make a search that contains all of the keywords."""
    equipos = Equipo.objects.all()
    for keyword in keywords:
        equipos = equipos.filter(
                                     Q(nombre__icontains=keyword)|
                                     Q(descripcion__icontains=keyword))
    return equipos

def obtenerEntrada(request,object_id):
    if int(object_id):
        try:
            objectoEntrada = EEntrada.objects.get(id=object_id)
        except ObjectDoesNotExist:
            return 'No existe el objecto'
    else:
        return 'No existe el objecto'
    return objectoEntrada

def search_for_keywords_entradas(keywords):
    """Make a search that contains all of the keywords."""
    entradas = EEntrada.objects.all()
    for keyword in keywords:
        entradas = entradas.filter(
                                     Q(fecha__icontains=keyword)|
                                     Q(equipo__nombre__icontains=keyword))
    return entradas

def listarEntradas(request,ot,o,page):
    
    request.breadcrumbs([('Depósito','/wal/dep'),('Entradas de Equipos',request.path)])
    
    if ot=='asc':
        if int(o) == 1:
            orden = "-fecha"
        elif int(o) == 2:
            orden = "-equipo"
        else:
            orden = "-fecha"
    elif ot=='desc':
        if int(o) == 1:
            orden = "fecha"
        elif int(o) == 2:
            orden = "equipo"
        else:
            orden = "fecha"
    else:
        orden = "-fecha"
    if request.method == 'GET':
        form = SearchForm(request.GET)
        if form.is_valid():
            keywords = form.cleaned_data['keywords']
            keyword_list = split_query_into_keywords(keywords)
            entradas = search_for_keywords_entradas(keyword_list)
            if entradas:
                # Show the results
                qs = entradas.order_by(orden)
            else:
                qs = EEntrada.objects.none()
            form = SearchForm()
            return object_list(request,
                   queryset = qs,
                   allow_empty = True,
                   template_name = 'equipos/listarEntradas.html',
                   extra_context = {'ot':ot,'o':o,'page':page,'form':form},
                   paginate_by = 20,
                   page = page,
                   )
    else:
        form = SearchForm()
    return object_list(request,
                   queryset = EEntrada.objects.order_by(orden),
                   allow_empty = True,
                   template_name = 'equipos/listarEntradas.html',
                   extra_context = {'ot':ot,'o':o,'page':page,'form':form},
                   paginate_by = 20,
                   page = page,
                   )

def crearEntrada(request):
    request.breadcrumbs([('Depósito','/wal/dep'),('Entradas de Equipos',reverse(listarEntradas,args=['asc',1,1])),('Agregar Entrada de Equipo',request.path)])
    if request.method == "POST":
        cforms = EEntradasForm(request.POST, instance=EEntrada())
        if cforms.is_valid():
            new_entrada = cforms.save()
            
            stock = EStock.objects.filter(equipo=new_entrada.equipo)
            if stock:
                stock = EStock.objects.get(equipo=new_entrada.equipo)
                stock.stock = stock.stock + new_entrada.cantidad
                stock.save()
            else:
                new_stock = EStock(equipo=new_entrada.equipo,stock=new_entrada.cantidad)
                new_stock.save()
        return HttpResponseRedirect('/wal/equipos/entradas/listar/ot=asc&o=1&page=1')
    else:
        cforms = EEntradasForm(instance=EEntrada())
    return render_to_response('equipos/entrada.html',{'form':cforms},context_instance=RequestContext(request))

    
def borrarEntrada(request, object_id,ot,o,page):
    entrada = obtenerEntrada(request, object_id)
    if entrada == 'No existe el objecto':
        return render_to_response('error.html',{'error':'No existe el objecto'})
    if request.method == "POST":
            stock = EStock.objects.filter(equipo=entrada.equipo)
            if stock:
                stock = EStock.objects.get(equipo=entrada.equipo)
                stock.stock = stock.stock - entrada.cantidad
                stock.save()
    return delete_object(request,
                         model = EEntrada, 
                         template_name = 'equipos/confirm_delete_entrada.html', 
                         post_delete_redirect = reverse(listarEntradas, args=[ot,o,page]),
                         object_id = object_id
                         )

def obtenerSalida(request,object_id):
    if int(object_id):
        try:
            objectoSalida = ESalida.objects.get(id=object_id)
        except ObjectDoesNotExist:
            return 'No existe el objecto'
    else:
        return 'No existe el objecto'
    return objectoSalida

def search_for_keywords_salidas(keywords):
    """Make a search that contains all of the keywords."""
    salidas = ESalida.objects.all()
    for keyword in keywords:
        salidas = salidas.filter(
                                     Q(fecha__icontains=keyword)|
                                     Q(equipo__nombre__icontains=keyword))
    return salidas

def listarSalidas(request,ot,o,page):
    
    request.breadcrumbs([('Depósito','/wal/dep'),('Salidas de Equipos',request.path)])
    
    if ot=='asc':
        if int(o) == 1:
            orden = "-fecha"
        elif int(o) == 2:
            orden = "-equipo"
        else:
            orden = "-fecha"
    elif ot=='desc':
        if int(o) == 1:
            orden = "fecha"
        elif int(o) == 2:
            orden = "equipo"
        else:
            orden = "fecha"
    else:
        orden = "-fecha"
    if request.method == 'GET':
        form = SearchForm(request.GET)
        if form.is_valid():
            keywords = form.cleaned_data['keywords']
            keyword_list = split_query_into_keywords(keywords)
            salidas = search_for_keywords_salidas(keyword_list)
            if salidas:
                # Show the results
                qs = salidas.order_by(orden)
            else:
                qs = ESalida.objects.none()
            form = SearchForm()
            return object_list(request,
                   queryset = qs,
                   allow_empty = True,
                   template_name = 'equipos/listarSalidas.html',
                   extra_context = {'ot':ot,'o':o,'page':page,'form':form},
                   paginate_by = 20,
                   page = page,
                   )
    else:
        form = SearchForm()
    return object_list(request,
                   queryset = ESalida.objects.order_by(orden),
                   allow_empty = True,
                   template_name = 'equipos/listarSalidas.html',
                   extra_context = {'ot':ot,'o':o,'page':page,'form':form},
                   paginate_by = 20,
                   page = page,
                   )

def crearSalida(request):
    request.breadcrumbs([('Depósito','/wal/dep'),('Salidas de Equipos',reverse(listarEntradas,args=['asc',1,1])),('Agregar Salida de Equipo',request.path)])
    if request.method == "POST":
        cforms = ESalidasForm(request.POST, instance=ESalida())
        if cforms.is_valid():
            new_salida = cforms.save(commit=False)
            
            stock = EStock.objects.filter(equipo=new_salida.equipo)
            if stock:
                stock = EStock.objects.get(equipo=new_salida.equipo)
                if new_salida.cantidad > stock.stock:
                    cleaned_data = super(ESalidasForm, cforms).clean()
                    cant = cleaned_data.get("cantidad")
                    #raise forms.ValidationError("Las Fechas están mal!")
                    msg = u"La Cantidad está mal!"
                    cforms._errors["cantidad"] = cforms.error_class([msg])
            
                    # These fields are no longer valid. Remove them from the
                    # cleaned data.
                    del cleaned_data["cantidad"]
                else:
                    stock.stock = stock.stock - new_salida.cantidad
                    stock.save()
                    new_salida.save()
                    return HttpResponseRedirect('/wal/equipos/salidas/listar/ot=asc&o=1&page=1')
    else:
        cforms = ESalidasForm(instance=ESalida())
    return render_to_response('equipos/salida.html',{'form':cforms}, context_instance=RequestContext(request))

def borrarSalida(request, object_id,ot,o,page):
    salida = obtenerSalida(request, object_id)
    if salida == 'No existe el objecto':
        return render_to_response('error.html',{'error':'No existe el objecto'})
    if request.method == "POST":
            stock = EStock.objects.filter(equipo=salida.equipo)
            if stock:
                stock = EStock.objects.get(equipo=salida.equipo)
                stock.stock = stock.stock + salida.cantidad
                stock.save()
    return delete_object(request,
                         model = ESalida, 
                         template_name = 'equipos/confirm_delete_salida.html', 
                         post_delete_redirect = reverse(listarSalidas, args=[ot,o,page]),
                         object_id = object_id
                         )
    
def search_for_keywords_stock(keywords):
    """Make a search that contains all of the keywords."""
    equipos = EStock.objects.all()
    for keyword in keywords:
        equipos = equipos.filter(
                                     Q(equipo__nombre__icontains=keyword)|
                                     Q(equipo__descripcion__icontains=keyword))
    return equipos
    
def verStock(request,ot,o,page):
    request.breadcrumbs([('Depósito','/wal/dep'),('Stock de Equipos',request.path)])
    
    if ot=='asc':
            orden = "-equipo"
    else:
            orden = "equipo"
    if request.method == 'GET':
        form = SearchForm(request.GET)
        if form.is_valid():
            keywords = form.cleaned_data['keywords']
            keyword_list = split_query_into_keywords(keywords)
            stock = search_for_keywords_stock(keyword_list)
            if stock:
                # Show the results
                qs = stock.order_by(orden)
            else:
                qs = EStock.objects.none()
            form = SearchForm()
            return object_list(request,
                   queryset = qs,
                   allow_empty = True,
                   template_name = 'equipos/stock.html',
                   extra_context = {'ot':ot,'o':o,'page':page,'form':form},
                   paginate_by = 20,
                   page = page,
                   )
    else:
        form = SearchForm()
    return object_list(request,
                   queryset = EStock.objects.order_by(orden),
                   allow_empty = True,
                   template_name = 'equipos/stock.html',
                   extra_context = {'ot':ot,'o':o,'page':page,'form':form},
                   paginate_by = 20,
                   page = page,
                   )
